package org.example.controller;

import org.example.annotation.CheckPermission;
import org.example.pojo.domain.Artifact;
import org.example.pojo.domain.ArtifactShow;
import org.example.result.Result;
import org.example.service.ArtifactService;
import org.example.utils.UploadUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

@RestController
@RequestMapping("/artifacts")
@CrossOrigin
public class ArtifactController {

    @Autowired
    private ArtifactService artifactService;

    // 文物可查看没有被拒绝或者审核中的列表
    // 任何角色：参观者、文物管理员、博物馆管理人员都可以访问
    @CheckPermission({"visitor", "curator", "admin"})
    @GetMapping("/listAvailable")
    public Result listAvailableArtifacts() {
        List<Artifact> artifacts = artifactService.listAvailableArtifacts();
        return Result.success("文物没有被拒绝或者审核中的列表",artifacts);
    }

    // 文物所有状态的列表
    // 只有文物管理员和博物馆管理人员可以访问
    @CheckPermission({"curator", "admin"})
    @GetMapping("/list")
    public Result listArtifacts() {
        List<Artifact> artifacts = artifactService.listArtifacts();
        return Result.success("所有文物",artifacts);
    }

    // 文物id的详情
    // 任何角色：参观者、文物管理员、博物馆管理人员都可以访问
    @CheckPermission({"visitor", "curator", "admin"})
    @GetMapping("/{id}")
    public Result getArtifact(@PathVariable("id") Integer artifactId) {
        Artifact artifact = artifactService.getArtifactById(artifactId);
        return Result.success("文物id:"+artifactId+"的详细信息",artifact);
    }

    // 添加文物
    // 只有文物管理员可以添加文物
    @CheckPermission({"curator"})
    @PostMapping("/add")
    public Result addArtifact(@RequestBody Artifact artifact) {
        artifactService.addArtifact(artifact);
        return Result.success("文物添加成功！");
    }

    // 文物更新
    // 只有文物管理员可以更新文物
    @CheckPermission({"curator"})
    @PutMapping("/update")
    public Result updateArtifact(@RequestBody Artifact artifact) {
        artifactService.updateArtifact(artifact);
        return Result.success("文物更新成功！");
    }

    // 文物id删除
    // 只有文物管理员可以删除文物
    @CheckPermission({"curator"})
    @DeleteMapping("/delete/{id}")
    public Result deleteArtifact(@PathVariable("id") Integer artifactId) {
        artifactService.deleteArtifact(artifactId);
        return Result.success("文物删除成功！");
    }

    // 分页获取文物列表
    // 任何角色：参观者、文物管理员、博物馆管理人员都可以访问
    @CheckPermission({"visitor", "curator", "admin"})
    @PostMapping("/listByPage")
    public Result listByPage(@RequestParam Integer size,@RequestParam Integer page) {
        artifactService.listByPage(size,page);
        return Result.success("文物添加成功！");
    }


    // 处理文物借展
    // 只有文物管理员可以借展文物
    @CheckPermission({"curator"})
    @PostMapping("/borrow")
    public Result borrow(@RequestBody ArtifactShow show) {
        try {
            artifactService.addShow(show);
        }catch (RuntimeException e) {
            return Result.error("请求借出失败: " + e.getMessage());
        }
        return Result.success("添加成功！");
    }

    // 上传文物图片
    // 任何角色：参观者、文物管理员、博物馆管理人员都可以上传图片
    @CheckPermission({"curator", "admin"})
    @PostMapping("/upload")
    public Result upImg(@RequestParam("file") MultipartFile file) throws IOException {
        String name = "fileName";
        String url = new String();
        try {
            url = UploadUtil.uploadImage(file);
        } catch (IOException e) {
            return Result.error(e.getMessage());
        }
        return Result.success("上传成功",url);
    }

    // 批准展览请求
    // 文物管理员、博物馆管理人员可以批准展览请求
    @CheckPermission({"curator", "admin"})
    @PostMapping("/approveById")
    public Result approveById(@RequestBody ArtifactShow show) {
        try {
            artifactService.approveById(show.getId());
        }catch (RuntimeException e) {
            return Result.error("批准借出失败: " + e.getMessage());
        }
        return Result.success("批准借出成功！");
    }

    // 查看所有的借出请求
    // 文物管理员、博物馆管理人员可以查看所有的借出请求
    @CheckPermission({"curator", "admin"})
    @GetMapping("/listBorrow")
    public Result listBorrow() {
        List<ArtifactShow> shows = artifactService.listBorrow();
        return Result.success("所有文物",shows);
    }
}

